package democache;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * @author Brook
 *
 * 通过hashmap实现简单缓存，但是存在线程安全问题，
 *
 * 如果使用synchronized保证并发安全，会导致性能差，代码复用能力差
 */
public class DemoCache1 {

    private final HashMap<String, Integer> cache = new HashMap<>();
    public synchronized Integer computer(String userId) throws InterruptedException {
        Integer result = cache.get(userId);
        //先检查HashMap里面有没有保存过之前的计算结果
        if(result == null) {
            //如果缓存中找不到，那么需要现在计算一下结果，并且保存到HashMap中
            result = doCompute(userId);
            cache.put(userId, result);
        }
        return result;
    }

    private Integer doCompute(String userId) throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
        return new Integer(userId);
    }


    public static void main(String[] args) throws InterruptedException {
        DemoCache1 demoCache1 = new DemoCache1();
        System.out.println("开始计算");
        Integer result = demoCache1.computer("12");
        System.out.println("第一次计算结果："+ result);
        result = demoCache1.computer("12");
        System.out.println("第二次计算结果："+result);
    }
}
